package com.h.forum.controller;

import com.h.forum.common.constant.Constants;
import com.h.forum.common.enums.ResultCode;
import com.h.forum.common.utils.JWTUtil;
import com.h.forum.pojo.model.Article;
import com.h.forum.pojo.model.Board;
import com.h.forum.pojo.request.ArticleCreateRequest;
import com.h.forum.pojo.request.ArticleModifyRequest;
import com.h.forum.pojo.response.AppResult;
import com.h.forum.pojo.response.UserInfoResponse;
import com.h.forum.services.IArticleService;
import com.h.forum.services.IBoardService;
import com.h.forum.services.IUserService;
import jakarta.annotation.Resource;
import jakarta.validation.constraints.NotNull;
import lombok.extern.slf4j.Slf4j;
import org.apache.tomcat.util.bcel.Const;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.List;

@Slf4j
@RestController
@RequestMapping("/article")
public class ArticleController {

    @Resource(name = "articleServiceImpl")
    private IArticleService articleService;

    @Resource(name = "userServiceImpl")
    private IUserService userService;

    @Resource(name = "boardServiceImpl")
    private IBoardService boardService;

    /**
     * 创建帖子信息
     * @param request
     * @return
     */
    @PostMapping("/create")
    public AppResult create (@Validated @RequestBody ArticleCreateRequest request) {
        // 校验用户的状态
        // 1、根据令牌进行解析信息
        Long userId = JWTUtil.getUserIdFromToken(Constants.JWT);
        UserInfoResponse user = userService.selectById(userId);
        if (user == null ||
                user.getState().equals(Constants.IS_STATUS_STATE)) {
            //用户已禁言
            log.warn(ResultCode.FAILED_USER_BANNED.toString());
            return AppResult.fail(ResultCode.FAILED_USER_BANNED);
        }

        // 2、校验板块信息
        Board board = boardService.selectById(request.getBoardId());
        if (board == null
                || board.getDeleteState().equals(Constants.IS_DELETE_STATE)
                || board.getState().equals(Constants.IS_STATUS_STATE)) {
            // 打印日志
            log.warn(ResultCode.FAILED_BOARD_BANNED.toString());
            // 返回响应
            return AppResult.fail(ResultCode.FAILED_BOARD_BANNED);
        }

        // 都没有问题，进行封装对象
        Article article = new Article();
        article.setBoardId(request.getBoardId()); // 所在板块的Id
        article.setUserId(userId); // 创建的用户Id
        article.setTitle(request.getTitle()); // 标题
        article.setContent(request.getContent()); // 内容

        // 调用Service层
        articleService.create(article);

        return AppResult.success();
    }

    /**
     * 获取列表
     * @param boardId 可以为空的板块Id
     * @return
     */
    @GetMapping("/getAllByBoardId")
    public AppResult<List<Article>> getAllByBoardId(
            @RequestParam(value = "boardId",required = false) Long boardId) {
        // 定义返回集合
        List<Article> articles;
        if (boardId == null) {
            // 查询所有
            articles = articleService.selectAll();
        }else {
            // 存在boardId
            articles = articleService.selectAllByBoardId(boardId);
        }

        // 结果是否为空
        if (articles == null) {
            // 则返回一个空集合
            articles = new ArrayList<>();
        }

        return AppResult.success(articles);
    }

    /**
     * 根据帖子的Id获取详细的信息
     */
    @GetMapping("/details")
    public AppResult<Article> getDetails(@RequestParam(value = "id") @NotNull Long id) {
        // 先获取到用户的Id
        Long userId = JWTUtil.getUserIdFromToken(Constants.JWT);

        // 调用Service
        Article article = articleService.selectDetailById(id);
        if (article == null) {
            // 返回错误信息
            return AppResult.fail(ResultCode.FAILED_ARTICLE_NOT_EXISTS);
        }
        // 检验时候是作者
        if (userId == article.getUserId()) {
            // 是作者
            article.setOwn(true);
        }

        return AppResult.success(article);
    }

    /**
     * 编辑帖子
     * @param request
     * @return
     */
    @PostMapping("/modify")
    public AppResult modify(@Validated @RequestBody ArticleModifyRequest request) {
        // 检验当前的用户是否是禁言的，禁言不能进行编辑帖子操作
        Long userId = JWTUtil.getUserIdFromToken(Constants.JWT);
        UserInfoResponse userInfo = userService.selectById(userId);
        if (userInfo.getState().equals(Constants.IS_STATUS_STATE)) {
            // 返回错误描述
            return AppResult.fail(ResultCode.FAILED_USER_BANNED);
        }

        // 根据传来的帖子Id，查询对应的帖子信息
        Article existsArticle = articleService.selectById(request.getId());
        if (existsArticle == null
                || existsArticle.getDeleteState().equals(Constants.IS_DELETE_STATE)) {
            // 为空，没有帖子
            // 返回错误描述
            return AppResult.fail(ResultCode.FAILED_ARTICLE_NOT_EXISTS);
        }

        // 对帖子进行修改，这里得和当前的用户Id和帖子的用户Id是否一致，也就是是否是作者
        if (!userId.equals(existsArticle.getUserId())) {
            // 不是作者不能修改帖子
            return AppResult.fail(ResultCode.FAILED_FORBIDDEN);
        }

        // 判断帖子的状态，是否是已经归档
        if (existsArticle.getState().equals(Constants.IS_STATUS_STATE)) {
            // 进行返回，不能访问
            return AppResult.fail(ResultCode.FAILED_ARTICLE_BANNED);
        }

        // 进行封装转换成 Article对象，传入到Service层
        Article article = new Article();
        article.setId(request.getId());
        article.setTitle(request.getTitle());
        article.setContent(request.getContent());

        // 传入到Service层
        articleService.modify(article);

        // 打印日志
        log.info("帖子更新成功. Article id = " + request.getId() + "User id = " + userId + ".");
        // 返回正确的结果
        return AppResult.success();
    }

    /**
     * 点赞功能
     * @param id
     * @return
     */
    @PostMapping("/thumbsUp")
    public AppResult thumbsUp(@RequestParam(value = "id") @NotNull Long id) {
        // 检验用户的状态是否可以进行点赞操作
        Long userId = JWTUtil.getUserIdFromToken(Constants.JWT);
        // 获取对应的用户信息
        UserInfoResponse userInfo = userService.selectById(userId);
        if (userInfo.getState().equals(Constants.IS_STATUS_STATE)) {
            // 用户不能进行修改
            return AppResult.fail(ResultCode.FAILED_USER_BANNED);
        }

        // 调用Service层
        articleService.thumbsUpById(id);

        // 返回结果
        return AppResult.success();
    }

    /**
     * 删除帖子
     * @param id
     * @return
     */
    @PostMapping("/delete")
    public AppResult delete(@RequestParam(value = "id") @NotNull Long id) {
        // 校验用户的状态
        Long userId = JWTUtil.getUserIdFromToken(Constants.JWT);
        // 获取对应的用户信息
        UserInfoResponse userInfo = userService.selectById(userId);
        if (userInfo.getState().equals(Constants.IS_STATUS_STATE)) {
            // 用户不能进行修改
            return AppResult.fail(ResultCode.FAILED_USER_BANNED);
        }

        // 获取帖子信息
        Article article = articleService.selectById(id);
        if (article == null
                || article.getDeleteState().equals(Constants.IS_DELETE_STATE)) {
            // 为空，没有帖子
            // 返回错误描述
            return AppResult.fail(ResultCode.FAILED_ARTICLE_NOT_EXISTS);
        }

        // 检验当前的用户和这个作者是否一致
        if (userId != article.getUserId()) {
            return AppResult.fail(ResultCode.FAILED_FORBIDDEN);
        }

        // 调用Service层
        articleService.deleteById(id);

        // 返回结果
        return AppResult.success();
    }

    @GetMapping("/getAllByUserId")
    public AppResult getAllByUserId(@RequestParam(value = "userId", required = false) Long userId) {
        // 如果userId为空，则从 令牌中解析
        if (userId == null) {
            userId = JWTUtil.getUserIdFromToken(Constants.JWT);
        }

        // 调用Service层
        List<Article> articles = articleService.selectByUserId(userId);
        return AppResult.success(articles);
    }
}
